//
//  DateFormatter.swift
//  Documentation
//
//  Created by Toj on 11/13/23.
//

open class DateFormatter : Formatter, @unchecked Sendable {

    /// 格式化上下文
    @available(iOS 8.0, *)
    open var formattingContext: Formatter.Context = .unknown

    open func getObjectValue(_ obj: AutoreleasingUnsafeMutablePointer<AnyObject?>?, for string: String, range rangep: UnsafeMutablePointer<NSRange>?) throws

    /// 根据 dateFormat, 日期 与 字符串 的转换
    /// 根据 dateFormat, Date 转换 字符串
    open func string(from date: Date) -> String
    /// 根据 dateFormat, 字符串 转换 Date
    open func date(from string: String) -> Date?

    /// 日期和时间格式样式
    @available(iOS 4.0, *)
    open class func localizedString(from date: Date, dateStyle dstyle: DateFormatter.Style, timeStyle tstyle: DateFormatter.Style) -> String

    
    /// 将字符串转换成规范的dateFormat字符串
    @available(iOS 4.0, *)
    open class func dateFormat(fromTemplate tmplate: String, options opts: Int, locale: Locale?) -> String?

    // 行为
    open class var defaultFormatterBehavior: DateFormatter.Behavior

    /// 应用模板字符串
    @available(iOS 8.0, *)
    open func setLocalizedDateFormatFromTemplate(_ dateFormatTemplate: String)

    /**
     * 日期格式化字符串
     * 符号  备注                  e.g.
     * G:   Era标志符              公元
     * y:   年份                   2020
     * Y:
     * M:   该年的第几月            12
     * w:   该年的第几周            51
     * W:   该月的第几周            3
     * D:   该年的第几天            351
     * d:   该月的第几天            16
     * F:   该月的第几星期           3
     * E:   周几                   周三
     * e:   该周的第几天            4
     * a:   Am/pm                 下午
     * Q:   第几季度                4
     * q:
     * H:   一天的第几小时（0-23）   15
     * k:   一天的第几小时（1-24）   15
     * h:   am/pm的第几小时（1-12）  3
     * K:   am/pm的第几小时（0-11）  3
     * m:   该小时的第几分钟         19
     * s:   该分钟的第几秒           55
     * S:   该秒的第几毫秒           978
     * z:   时区                   GMT+8
     * Z:   时区                   +0800
     */
    open var dateFormat: String!

    /// 时间样式
    open var dateStyle: DateFormatter.Style
    open var timeStyle: DateFormatter.Style

    /// 区域
    open var locale: Locale!

    /// true: 在解析日期时会返回NSCalendarDate实例而不是NSDate
    /// NOTE: 但NSCalendarDate在Swift中已不可用, 因而generatesCalendarDates已失效.
    open var generatesCalendarDates: Bool = false

    open var formatterBehavior: DateFormatter.Behavior

    /// 时区
    open var timeZone: TimeZone!

    /// 日历
    open var calendar: Calendar!

    /// 表示要严格按照dateFormat来格式化.
    /// 当为true时, 即使字符串与dateFormat有差距, 也能成功转换为Date
    open var isLenient: Bool = false

    /// 开始日期
    open var twoDigitStartDate: Date?

    /// 默认日期
    open var defaultDate: Date?

    /// 纪元标志符
    open var eraSymbols: [String]!

    /// 月份标志符
    open var monthSymbols: [String]!
    open var shortMonthSymbols: [String]!

    /// 星期标志符
    open var weekdaySymbols: [String]!
    open var shortWeekdaySymbols: [String]!

    /// 时间段标志符
    open var amSymbol: String!
    open var pmSymbol: String!

    /// 纪元标志符
    @available(iOS 2.0, *)
    open var longEraSymbols: [String]!

    /// 月份标志符
    @available(iOS 2.0, *)
    open var veryShortMonthSymbols: [String]!
    @available(iOS 2.0, *)
    open var standaloneMonthSymbols: [String]!
    @available(iOS 2.0, *)
    open var shortStandaloneMonthSymbols: [String]!
    @available(iOS 2.0, *)
    open var veryShortStandaloneMonthSymbols: [String]!

    /// 星期标志符
    @available(iOS 2.0, *)
    open var veryShortWeekdaySymbols: [String]!
    @available(iOS 2.0, *)
    open var standaloneWeekdaySymbols: [String]!
    @available(iOS 2.0, *)
    open var shortStandaloneWeekdaySymbols: [String]!
    @available(iOS 2.0, *)
    open var veryShortStandaloneWeekdaySymbols: [String]!

    /// 季度标志符
    @available(iOS 2.0, *)
    open var quarterSymbols: [String]!
    @available(iOS 2.0, *)
    open var shortQuarterSymbols: [String]!
    @available(iOS 2.0, *)
    open var standaloneQuarterSymbols: [String]!
    @available(iOS 2.0, *)
    open var shortStandaloneQuarterSymbols: [String]!

    /// 公历开始时间
    @available(iOS 2.0, *)
    open var gregorianStartDate: Date?

    /// 为true时, 会以前天、昨天、今天、明天、后天来显示日期而不是通过年月日来显示.
    @available(iOS 4.0, *)
    open var doesRelativeDateFormatting: Bool = false
}
